home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / scbench.arc / VIDEO.C < prev   
Text File  |  1980-01-01  |  9KB  |  482 lines

  1. /*
  2. **
  3. ** BYTE Small-C Video Support Routines
  4. ** NOTE: Many of these routines were adapted from code presented
  5. **       in Richard Wilton's PROGRAMMER'S GUIDE TO PC & PS/2
  6. **       VIDEO SYSTEMS (Microsoft Press, ISBN 1-55615-103-9)
  7. **       (A *fabulous* book, by the way.)
  8. **       Also, Robert Jourdain's PROGRAMMER'S PROBLEM SOLVER
  9. **       FOR THE IBM PC,XT & AT (Brady Books, ISBN 0-89303-787-7)
  10. **       (Another fine book.)
  11. **
  12. ** setp(x,y,color,mode)
  13. ** Set pixel at x,y to color. Mode is mode #.
  14. ** This function assumes that ES points to the video segment.
  15. */
  16. setp(x,y,color,mode)
  17. int x,y,color,mode;
  18. {
  19. #asm
  20.     MOV    BP,SP        ;Get pointer to arguments
  21.     MOV    AX,6[BP]    ;y coord
  22.     MOV    BX,8[BP]    ;x coord
  23.     MOV     CX,2[BP]    ;Mode
  24. ;Determine which routine to execute using mode
  25. ;First check for Hercules
  26.     CMP    CL,255
  27.     JNE    SETP10
  28. ;
  29. ; Hercules mode
  30.     CALL CALCPH
  31. SETP01:
  32.     MOV    AL,4[BP]    ;Get color
  33.     SHL    AX,CL        ;Shift in
  34.     NOT    AH
  35.     AND    ES:[BX],AH    ;Zero the pixel
  36.     OR    ES:[BX],AL    ;Set it
  37.     XOR    CX,CX        ;For small c
  38.     RET
  39. ;
  40. SETP10:
  41.     CMP    CL,6
  42.     JGE    SETP20
  43. ;
  44. ;Modes 4 and 5
  45. ;
  46.     CALL CALCP4
  47.     JMP    SHORT SETP01    ;Borrow code
  48. ;
  49. SETP20:
  50.     CMP    CL,13
  51.     JGE    SETP30
  52. ;
  53. ;Mode 6
  54. ;
  55.     CALL CALCP6
  56.     JMP    SHORT SETP01    ;Borrow code
  57. ;
  58. SETP30:
  59.     CMP    CL,14
  60.     JGE    SETP40
  61. ;
  62. ;Mode 13
  63. ;
  64.     CALL CALCP13
  65. SETP31:
  66.     SHL    AH,CL        ;Position mask
  67.     MOV    DX,3CEH        ;Address register port
  68.     MOV    AL,8        ;Mask register number
  69.     OUT    DX,AX
  70.     MOV    AX,205H        ;Mode register number 2, write mode 2
  71.     OUT    DX,AX
  72.     MOV    AH,0        ;Replace mode
  73.     MOV    AL,3        ;Data rotate/function select register
  74.     OUT    DX,AX
  75.     MOV    AL,ES:[BX]    ;Load the latches
  76.     MOV    AL,4[BP]    ;Get the color
  77.     MOV    ES:[BX],AL    ;Store it
  78.     MOV    AX,0FF08H    ;Restore defaults
  79.     OUT    DX,AX
  80.     MOV    AX,5
  81.     OUT    DX,AX
  82.     MOV    AX,3
  83.     OUT    DX,AX
  84.     XOR    CX,CX
  85.     RET
  86. ;
  87. SETP40:
  88.     CMP    CL,17
  89.     JGE    SETP50
  90. ;
  91. ; Modes 14,15,16
  92. ;
  93. SETP41:
  94.     CALL CALCP14
  95.     JMP    SHORT SETP31    ;Borrow code
  96. ;
  97. SETP50:
  98.     CMP    CL,18
  99.     JGE    SETP60
  100. ;
  101. ; Mode 17
  102. ;
  103.     CALL CALCP14
  104.     JMP SHORT SETP01    ;Borrow code
  105. ;
  106. SETP60:
  107.     CMP    CL,18
  108.     JZ    SETP41            ;18 same as EGA
  109. ;
  110. ; Mode 19
  111. ;
  112.     CALL CALCP19
  113.     MOV    AL,4[BP]    ;Get color
  114.     MOV    ES:[BX],AL    ;set it
  115.     XOR    CX,CX        ;For small c
  116.     RET
  117. ;
  118. ; Calculate pixel address for modes 4 and 5
  119. ; Entry: AX = y coord
  120. ;        BX = x coord
  121. ; Exit:  AH = bit mask
  122. ;        BX = byte offset
  123. ;        CL = number of bits to shift
  124.     PUBLIC CALCP4
  125. CALCP4:
  126.     MOV CL,BL
  127.     XCHG AH,AL
  128.     SHR AX,1
  129.     ADD BH,AL
  130.     XOR AL,AL
  131.     ADD BX,AX
  132.     SHR AX,1
  133.     SHR AX,1
  134.     ADD BX,AX
  135.     SHR BX,1
  136.     SHR BX,1
  137.     MOV AH,3
  138.     AND CL,AH
  139.     XOR CL,AH
  140.     SHL CL,1
  141.     RET
  142. ;
  143. ; Calculate address of pixel for mode 6
  144. ; Entry: See abov
  145. ; Exit: See above
  146. ;
  147.     PUBLIC CALCP6
  148. CALCP6:
  149.     MOV CL,BL
  150.     XCHG AH,AL
  151.     SHR BX,1
  152.     SHR AX,1
  153.     ADD BH,AL
  154.     XOR AL,AL
  155.     ADD BX,AX
  156.     SHR AX,1
  157.     SHR AX,1
  158.     ADD BX,AX
  159.     SHR BX,1
  160.     SHR BX,1
  161.     AND CL,7
  162.     XOR CL,7
  163.     MOV AH,1
  164.     RET
  165. ;
  166. ; Calculate pixel address for mode 13
  167. ; Entry: See above
  168. ; Exit: See above
  169. ;
  170.     PUBLIC CALCP13
  171. CALCP13:
  172.     MOV CL,BL
  173.     MOV DX,40
  174. CP13COM:
  175.     MUL DX 
  176.     SHR BX,1
  177.     SHR BX,1
  178.     SHR BX,1
  179.     ADD BX,AX
  180.     AND CL,7
  181.     XOR CL,7
  182.     MOV AH,1
  183.     RET
  184. ;
  185. ; Calculate pixel address for modes 14,15,16,17,18
  186. ; Entry: See above
  187. ; Exit: See above
  188. ;
  189.     PUBLIC CALCP14
  190. CALCP14:
  191.     MOV CL,BL
  192.     MOV DX,80
  193.     JMP SHORT CP13COM
  194. ;
  195. ; Calculate pixel address for mode 19
  196. ; Entry: See above
  197. ; Exit: See above
  198. ; Note: we don't need a bit mask in AH or a shift count in CL 
  199. ;       for this mode.
  200. ;
  201.     PUBLIC CALCP19
  202. CALCP19:
  203.     XCHG AH,AL
  204.     ADD BX,AX
  205.     SHR AX,1
  206.     SHR AX,1
  207.     ADD BX,AX
  208.     RET
  209. ;
  210. ; Calculate pixel address for Hercules graphics mode
  211. ;
  212.     PUBLIC CALCPH
  213. CALCPH:
  214.     MOV    CL,BL
  215.     SHR AX,1
  216.     RCR BX,1
  217.     SHR AX,1
  218.     RCR BX,1
  219.     SHR BX,1
  220.     MOV AH,90
  221.     MUL AH
  222.     ADD BX,AX
  223.     AND CL,7
  224.     XOR CL,7
  225.     MOV AH,1
  226.     RET
  227. #endasm
  228. }
  229.  
  230. /*
  231. ** getp(x,y,mode)
  232. ** Returns value of pixel at x,y
  233. ** mode holds current graphics mode
  234. */
  235. getp(x,y,mode)
  236. int x,y,mode; {
  237. #asm
  238.     MOV BP,SP    ;Get pointer to arguments
  239.     MOV CX,2[BP]    ;Get mode
  240.     MOV AX,4[BP]    ;Get y coord
  241.     MOV BX,6[BP]    ;Get x coord
  242. ;
  243.     CMP    CL,255        ;Hercules mode selected by 255
  244.     JNE    GETP10
  245. ;
  246. ; Hercules monochrome mode
  247. ;
  248.     CALL CALCPH
  249. GETP01:
  250.     MOV    BL,ES:[BX]
  251.     SHR BL,CL
  252.     AND BL,AH
  253.     XOR BH,BH
  254.     XOR CX,CX
  255.     RET
  256. ;
  257. GETP10:
  258.     CMP CL,6
  259.     JGE GETP20
  260. ;
  261. ; Modes 4 and 5
  262. ;
  263.     CALL CALCP4
  264.     JMP SHORT GETP01    ;Borrow code
  265. ;
  266. GETP20:
  267.     CMP CL,7
  268.     JGE    GETP30
  269. ;
  270. ; Mode 6
  271. ;
  272.     CALL CALCP6
  273.     JMP SHORT GETP01    ;Borrow code
  274. ;
  275. GETP30:
  276.     CMP    CL,14
  277.     JGE    GETP40
  278. ;
  279. ; Mode 13
  280. ;
  281.     CALL CALCP13
  282. GETP31:
  283.     MOV CH,AH
  284.     SHL CH,CL
  285.     MOV SI,BX
  286.     MOV DX,3CEH
  287.     MOV AX,304H
  288.     XOR BL,BL
  289. GETP32:
  290.     OUT DX,AX
  291.     MOV BH,ES:[SI]
  292.     AND BH,CH
  293.     NEG BH
  294.     ROL BX,1
  295.     DEC AH
  296.     JGE GETP32
  297.     XOR BH,BH
  298.     XOR CX,CX
  299.     RET
  300. ;
  301. GETP40:
  302.     CMP    CL,15
  303.     JNE GETP50
  304. ;
  305. ; Special for mode 15
  306. ;
  307.     CALL CALCP14
  308.     MOV CH,AH
  309.     SHL CH,CL
  310.     MOV SI,BX
  311.     MOV DX,3CEH
  312.     MOV AX,204H
  313.     XOR BL,BL
  314. GETP41:
  315.     OUT DX,AX
  316.     MOV BH,ES:[SI]
  317.     AND BH,CH
  318.     NEG BH
  319.     ROL BX,1
  320.     SUB AH,2
  321.     JGE GETP41
  322.     XOR BH,BH
  323.     XOR CX,CX
  324.     RET
  325. ;
  326. GETP50:
  327.     CMP    CL,17
  328.     JGE    GETP60
  329. ;
  330. ; Modes 14 and 16
  331. ;
  332. GETP51:
  333.     CALL CALCP14
  334.     JMP GETP31        ;Borrow code
  335. ;
  336. GETP60:
  337.     CMP    CL,18
  338.     JZ    GETP51        ;Mode 18 same as EGA 14 and 16
  339. ;
  340. ; Mode 19
  341. ;
  342.     CALL CALCP19
  343.     MOV BL,ES:[BX]
  344.     XOR    BH,BH
  345.     XOR CX,CX
  346. #endasm
  347. }
  348.  
  349. /*
  350. ** 8088/8086 version
  351. ** svmode(mode) int mode; {
  352. ** Set video mode.
  353. ** Mode is:
  354. ** 0 - 40 x 25 chars b&w (cga,ega,mcga,vga)
  355. ** 1 - 40 x 25 chars color (cga,ega,mcga,vga)
  356. ** 2 - 80 x 25 chars b&w (cga,ega,mcga,vga)
  357. ** 3 - 80 x 25 chars color (cga,ega,mcga,vga)
  358. ** 4 - 320 x 200 4-color graph (cga,ega,mcga,vga)
  359. ** 5 - 320 x 200 b&w graph (cga,ega,mcga,vga)
  360. ** 6 - 640 x 200 b&w graph (cga,ega,mcga,vga)
  361. ** 7 - 80 x 25 chars b&w (mda,ega,vga)
  362. ** 8 - 160 x 200 16-color graph (jr)
  363. ** 9 - 320 x 200 16-color graph (jr)
  364. ** 10 - 640 x 200 4-color graph (jr)
  365. ** 11 - reserved by EGA video BIOS
  366. ** 12 - reserved by EGA video BIOS
  367. ** 13 - 320 x 200 16-color graph (ega,vga)
  368. ** 14 - 640 x 200 16-color graph (ega,vga)
  369. ** 15 - 640 x 350 2-color graph (ega,vga)
  370. ** 16 - 640 x 350 4- or 16-color (ega,vga)
  371. ** 17 - 640 x 480 2-color (mcga,vga)
  372. ** 18 - 640 x 480 16-color (vga)
  373. ** 19 - 320 x 200 256-color (mcga,vga)
  374. ** 255 - Heculese 720x348 monochrome graphics
  375. */
  376. svmode(mode) int mode; {
  377. #asm
  378.     MOV    BP,SP
  379.     MOV    AX,2[BP]
  380.     CMP    AX,255        ;Hercules?
  381.     JZ    HERC
  382.     PUSH    DS
  383.     MOV    BX,40H        ;Video display data area
  384.     MOV    DS,BX
  385.     MOV    BL,32        ;Presence of CGA
  386.     MOV    AX,2[BP]
  387.     MOV    DL,AL
  388.     AND    DL,7
  389.     CMP    DL,7
  390.     JNE    SVM1
  391.     MOV    BL,48        ;Presence of MDA
  392. SVM1:    AND    BYTE PTR DS:[10H],11001111B
  393.     OR    BYTE PTR DS:[10H],BL
  394.     INT    10H    ;Set the mode
  395.     POP    DS        ;Restore DS
  396.     XOR    CX,CX    ;Clear for Small-C
  397.     RET
  398. HERC:    
  399. ;Update video bios data area
  400.     MOV    AX,40H
  401.     MOV    ES,AX
  402.     MOV    DI,49H    ;ES:DI is video bios data area
  403.     MOV    SI,OFFSET BDATA
  404.     MOV    CX,BDLEN
  405.     REP    MOVSB        ;Update video bios data
  406. ;Set config. switch
  407.     MOV    DX,3BFH        ;Config switch port
  408.     MOV    AL,1        ;Exclude second 32K of video buffer
  409.     OUT    DX,AL
  410. ;Blank the screen
  411.     MOV    DX,3B8H
  412.     XOR    AL,AL
  413.     OUT    DX,AL
  414. ;Program the CRTC
  415.     SUB    DL,4        ;3b4H is addres reg port of CRTC
  416.     MOV    SI,OFFSET CRTCP
  417.     MOV    CX,9        ;9 parameters to load
  418. HERC1:    LODSW            ;Al=crtc register number/AH=VALUE
  419.     OUT    DX,AX
  420.     LOOP    HERC1
  421. ;Set graphics mode
  422.     ADD    DL,4
  423.     MOV    AL,CRTMD
  424.     OUT     DX,AL
  425. ;Clear the video buffer
  426.     MOV    AX,0B000H
  427.     MOV    ES,AX
  428.     XOR    AX,AX        ;Clear to zero
  429.     XOR    DI,DI
  430.     MOV    CX,4000H
  431.     REP    STOSW
  432.     XOR    CX,CX        ;Clear for small c
  433.     RET            ;Go home
  434. ;Configurations stuff for Hercules
  435. CRTCP    DB    00H,35H        ;54 chars horizontal
  436.     DB    01,2DH        ;45 displayed
  437.     DB    02,2EH        ;Sync at 46th char
  438.     DB    03,07H        ;Sync width 7 char clocks
  439.     DB    4,5BH        ;Vert total of 92 characters
  440.     DB    05,02H        ;Vert adjust of 2 scan lines
  441.     DB    06,57H        ;Vert displayed of 87 char rows
  442.     DB    07,57H        ;Vert. sync after 87th char row
  443.     DB    09,03H        ;Max scan line, 4 scan lines per char
  444. BDATA    DB    7        ;CRT_MODE
  445.     DW    80        ;CRT_COLS
  446.     DW    8000H        ;CRT_LEN
  447.     DW    0        ;CRT_START
  448.     DW    8 DUP (0)    ;CURSOR_POSN
  449.     DW    0        ;CURSOR_MODE
  450.     DB    0        ;ACTIVE_PAGE
  451.     DW    3B4H        ;ADDR_6845
  452. CRTMD    DB    0AH        ;CRT_MODE_SET
  453.     DB    0        ;PALLETTE
  454. BDLEN    EQU    $-BDATA
  455. #endasm
  456. }
  457.  
  458. /*
  459. ** 8088/8086 version
  460. ** gvmode(vlock) int vblock[3] ; { - Get current video mode
  461. ** Returns current video mode info
  462. ** vblock[0] = current video mode #
  463. ** vblock[1] = character columns on screen
  464. ** vblock[2] = current display page #
  465. */
  466. gvmode() {
  467. #asm
  468.     MOV    AH,0FH
  469.     INT    10H
  470.     MOV    BP,SP
  471.     MOV    SI,2[BP]    ;Pointer to tblock
  472.     XOR    CH,CH        ;Clear hi part
  473.     MOV    CL,AL
  474.     MOV    [SI],CX        ;Mode #
  475.     MOV    CL,AH
  476.     MOV    2[SI],CX    ;Char columns on screen
  477.     MOV    CL,BH
  478.     MOV    4[SI],CX    ;Current display page
  479.     XOR    CX,CX        ;Clear
  480. #endasm
  481. }
  482.